package container

import "sync"

type SyncSlice[V any] struct {
	rw    sync.RWMutex
	slice []V
}

// 创建SyncSlice
func NewSyncSlice[V any]() SyncSlice[V] {
	return SyncSlice[V]{}
}

// 添加SyncSlice
func (s *SyncSlice[V]) Add(v V) {
	s.rw.Lock()
	defer s.rw.Unlock()
	s.slice = append(s.slice, v)
}

// 获取指定索引的值
func (s *SyncSlice[V]) GetIndex(index int) V {
	s.rw.RLock()
	defer s.rw.RUnlock()
	return s.slice[index]
}

// 修改指定索引的值
func (s *SyncSlice[V]) SetIndex(index int, v V) {
	s.rw.Lock()
	defer s.rw.Unlock()
	s.slice[index] = v
}

// 删除SyncSlice
func (s *SyncSlice[V]) Delete(index int) {
	s.rw.Lock()
	defer s.rw.Unlock()
	s.slice = append(s.slice[:index], s.slice[index+1:]...)
}

// 遍历SyncSlice
func (s *SyncSlice[V]) Range(f func(index int, value V) bool) {
	s.rw.RLock()
	defer s.rw.RUnlock()
	for i := range s.slice {
		if !f(i, s.slice[i]) {
			break
		}
	}
}

// 获取SyncSlice长度
func (s *SyncSlice[V]) Len() int {
	s.rw.RLock()
	defer s.rw.RUnlock()
	return len(s.slice)
}

// 清空SyncSlice
func (s *SyncSlice[V]) Clear() {
	s.rw.Lock()
	defer s.rw.Unlock()
	s.slice = []V{}
}

// 判断SyncSlice是否是空
func (s *SyncSlice[V]) IsEmpty() bool {
	s.rw.RLock()
	defer s.rw.RUnlock()
	return len(s.slice) == 0
}

// 获取SyncSlice,返回副本,因为不允许操作原始SyncSlice保证线程安全
func (s *SyncSlice[V]) GetSlice() []V {
	s.rw.RLock()
	defer s.rw.RUnlock()
	newSyncSlice := make([]V, len(s.slice))
	copy(newSyncSlice, s.slice)
	return newSyncSlice
}

// 将多个值批量添加到SyncSlice
func (s *SyncSlice[V]) AddAll(values ...V) {
	s.rw.Lock()
	defer s.rw.Unlock()
	s.slice = append(s.slice, values...)
}
